[리팩터링] 게시판 프로젝트 아키텍처

개인 프로젝트 진행

이 프로젝트는 그동안 학습한 내용을 종합적으로 적용해보기 위해 진행하였다. 1차 개발을 완료한 이후 리팩토링을 진행하면서 불필요하게 사용한 기술은 없는지, 학습에 치중되어 개발 방향이 흐트러진 부분은 없는지 점검하고 있다.

사용 도구들..

  • spring boot 3.3.5
  • java 17
  • H2 Database
  • Thymeleaf
[Client]


[Filter / Interceptor]  (로그인 인증)


[Controller] → [Service] → [Repository] → [H2 Database]


[Thymeleaf View] → 응답

Application Flow

Client 요청 -> Spring - > View (Thymeleaf)

초기에 작성한 로그인 및 게시판 Flow를 그림으로 정리하였다.

현재 방식) 로그인 시점에 Filter에서 HttpSession에 세션값이 있는지 확인하고, 해당 로그인아이디 값에 해당하는 URL로 리다이렉트시킨다.

문제) 세션의 유무만으로 인증이 처리되기 때문에, URL의 loginID를 변경하면 다른 사용자로 로그인되는 문제가 발생한다.

해결) Interceptor에서 정규표현식으로 로그인 아이디와 세션의 로그인 정보를 비교하여 사용자 변경을 막았다. 다만 이 방법은 URL 변경 자체를 사용자가 인지하고 조작할 수 있다는 보안상 한계가 있어, URL 구조를 변경하고 세션 처리를 강화하는 방향으로 개선하고자 한다.

지금 생각하기에 문제가 되는 지점은)
이를 변경하고자한다)
1. UUID형태의 세션을 통해서 로그인 인증
2. URL변경시마다 Filter를 통해서 세션 갱신
3. 세션저장소에서는 갱신된 시간 이후, 정해진 시간안에 갱신되지 못할경우 삭제처리

[Before] 로그인 및 게시판 — 로그인 기능 + Exception(error) 처리 + DB 구성만 갖춘 초기 구조

[Client] → [Filter: HttpSession 유무 확인] → [Controller: /members/{loginId}]

                                        [Interceptor: URL loginId ↔ Session 비교]

                                            [Service] → [H2 DB]

로그인 기능 + Exception(error) 처리 + DB 구성

[Before] Application Flow — 초기 요청 흐름 (Client → Filter/Interceptor 인증 → Spring Controller → Thymeleaf View)

ERD

회원에따른 게시판만 있는 기능이기에 DB에 적재할 내용은 많지는 않다..
기능 추가가 더 이루어진다면 게시판 개체를 더 작은 사이즈로 나누거나 따른 개체를 붙이거나 하는 경우가 생길 거 같지만, 아직은 구상만 진행중에 있다..

Member                    Board
------------------        ------------------
id (PK)                   id (PK)
loginId                   title
passwd                    content
name                      writer (FK → Member.id)
...                       createdAt
                          ...
 
Member (1) ──── (N) Board

URL 디자인

URL디자인 수정 작업 (loginId 부분 제거 예정)

  1. HttpSession Store를 이용하여 세션관리
  2. loginId를 대신해서, 필터 혹은 인터셉트를 거칠경우 인증을 관리하는 객체를 만들어서 loginId를 구현해보고자한다..
    ( AOP (?), Resolver(?), custom annotation 등등..)
구분URL 예시
변경 전/members/{loginId}/boards/{boardId} (URL에 loginId 노출)
변경 후/boards/{boardId} (loginId는 Session Store + Resolver를 통해 서버 내부에서 조회)

관련 문서